﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CC;
using PC;
using System.Windows.Forms;
using System.Threading;
namespace RFMS
{
    public class BonPrinten
    {
        public BonPrinten()
        {
            _orderBeheer = new OrderBeheer();
            _bonKlant = new BonKlant();
            _print = new PCPrint();
        }
        private string _tafelNaam;
        private OrderBeheer _orderBeheer;
        private BonKlant _bonKlant;
        private PCPrint _print;
        private string _gebruikersnaam;
        private int _orderId;

        public bool BonVoorKlant(string tafelNaam, double teGoed)
        {            
            _tafelNaam = tafelNaam;
            bool returnType = false;
            int onafgehandeld = 0;
            List<List<string>> lijst;
            string heleString = "BIEJ DE TANT\n\r";
            heleString += "Bouwbergstraat 126\n\r";
            heleString += "6451 GR Schinveld\n\r\n\r";
            onafgehandeld = _orderBeheer.OnafgehandeldeOrder(_tafelNaam);
            string aantal = "";
            double btw19 = 0;
            double btw6 = 0;
            double totaalArtikel = 0;
            double totaal = 0;
            string artikelNaam = "";
            DateTime orderDatum = new DateTime(2000, 01, 01, 00, 00, 00);

            if (onafgehandeld != 0)
            {
                lijst = _bonKlant.BonKlantPrinten(_tafelNaam);
                foreach (var l in lijst)
                {
                    aantal = l[0];
                    if (l[0].Length < 2)
                    {
                        aantal = "  " + aantal;
                    }

                    artikelNaam = l[1];

                    if (artikelNaam.Length < 20)
                    {
                        for (int i = 20 - artikelNaam.Length; i >= 0; i--)
                        {
                            artikelNaam += " ";
                        }
                    }

                    orderDatum = Convert.ToDateTime(l[5]);
                    totaalArtikel = Convert.ToDouble(l[2]) * Convert.ToInt32(l[0]);

                    switch (l[3])
                    {
                        case "6":
                            btw6 += totaalArtikel * 0.06;
                            break;
                        case "19":
                            btw19 += totaalArtikel * 0.19;
                            break;
                    }
                    totaal += totaalArtikel;
                    heleString += "   " + aantal + "  " + artikelNaam + totaalArtikel + "\n\r";
                }
                heleString += "\n\r=============================";
                heleString += "\n\r" + "Totaal: " + totaal + "\n\r";
                heleString += "BTW19%: " + btw19 + "\n\r";
                heleString += "BTW6%: " + btw6 + "\n\r";
                heleString += "Tegoed: " + teGoed + "\n\r";
                totaal += (btw19 + btw6);
                double korting = totaal - teGoed;
                heleString += "Subtotaal: " + korting + "\n\r";
                heleString += "\n\rOrder nummer: " + onafgehandeld + "\n\r";
                heleString += "Order datum: " + orderDatum + "\n\r";
                heleString += "Datum bon: " + DateTime.Now + "\n\r\n\r";
                heleString += "DANK U WEL EN GRAAG TOT ZIENS!";
                Print(heleString, orderDatum.ToString(), "Bullzip PDF Printer");
                _orderBeheer.AfhandelenOrder(_tafelNaam);
                returnType = true;
            }

            else
            {
                returnType = false;
            }

            return returnType;
        }

        public bool BonVoorInboeken(List<List<string>> lijst, string tafelNaam, string gebruikersnaam, int orderId)
        {
            this._tafelNaam = tafelNaam;
            this._gebruikersnaam = gebruikersnaam;
            this._orderId = orderId;
            List<List<string>> lijstBar = new List<List<string>>();
            List<List<string>> lijstKeuken = new List<List<string>>();
            bool returnType = false;

            foreach (var l in lijst)
            {
                if (l[3] == "Bar")
                {
                    lijstBar.Add(l);
                }

                if (l[3] == "Keuken")
                {
                    lijstKeuken.Add(l);
                }
            }

            if (lijstBar.Count > 0)
            {
                returnType = VerwerkenVoorPrinten(lijstBar, "Bullzip PDF Printer");           
            }

            Thread.Sleep(1000);

            if (lijstKeuken.Count > 0)
            {
                returnType = VerwerkenVoorPrinten(lijstKeuken, "Bullzip PDF Printer");
            }

            return returnType;
        }

        private bool VerwerkenVoorPrinten(List<List<string>> lijstBar, string printerNaam)
        {
            string heleString = "Tafel: " + _tafelNaam + "\n\r";
            heleString += DateTime.Now + "\n\r\n\r";

            foreach (var l in lijstBar)
            {
                if (l[0].Length < 2) { l[0] = " " + l[0]; }
                heleString += l[0] + "  " + l[2] + "\n\r";
            }

            heleString += "\n\r\n\rOrder nummer: " + _orderId + "\n\r";
            heleString += "Opgenomen door: " + _gebruikersnaam + "\n\r";
            return Print(heleString, "or" + DateTime.Now, printerNaam);
        }

        private bool Print(string tekstOmTePrinten, string NaamVanDocument, string printerNaam)
        {
            bool returnType = false;
            try
            {
                _print.DocumentName = NaamVanDocument;
                _print.TextToPrint = tekstOmTePrinten;
                _print.PrinterSettings.PrinterName = printerNaam;
                _print.Print();
                returnType = true;
            }

            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            return returnType;
        }
    }
}
